import axios from "axios";
import { message } from "antd";
import store from "../redux/store";
import { deleteUserInfo } from "../redux/action_creators/login_action";

const instance = axios.create({
  timeout: 4000,
});

// 添加请求拦截器
instance.interceptors.request.use((config) => {
  // 在发送请求之前做些什么

  // 在给我自己定义的api发送请求时，需要打开此拦截器，因为要携带token信息，否则无法获取数据， 在请求达内的接口时需关闭，因为他的接口不需要携带token信息
  const { token } = store.getState().userInfo;
  if (token) {
    config.headers.Authorization = token;
  }

  // const { method, data } = config;
  // if (method.toLowerCase() === "post") {
  //   if (data instanceof Object) {
  //     config.data = qs.stringify(data);
  //   }
  // }

  return config;
});

// 添加响应拦截器
instance.interceptors.response.use(
  (response) => {
    // 2xx 范围内的状态码都会触发该函数。
    // 对响应数据做点什么

    //因为我自己在设置API接口时已经拦截过错误信息，所以即使token失效，还是正常返回了数据，而不是报错，因此要在response里进行拦截
    if (response.data.status === 401) {
      message.error(response.data.message, 1);
      store.dispatch(deleteUserInfo());
    }

    if (response.data.status === 1) {
      message.error(response.data.message, 3);
      return new Promise(() => {});
    }

    return response.data;
  },
  (error) => {
    // 超出 2xx 范围的状态码都会触发该函数。
    // 对响应错误做点什么

    //这个是对尚硅谷的接口返回报错信息的拦截，即token失效的拦截
    if (error.status === 401) {
      message.error("身份校验失败token", 1);
      store.dispatch(deleteUserInfo());
    } else {
      message.error(error.message);
    }
    return new Promise(() => {});
  }
);

export default instance;
